package com.xjh.basestudy.designmode.behaviorMode.behaviorMode8_Command.p2_command;

import com.xjh.basestudy.designmode.behaviorMode.behaviorMode8_Command.p1_origin.Bulb;

/**
 * @Author XuJianHua
 * @Date 2022/10/5 20:10
 * @Description
 *
 * 客户端类Client首先实例化了开关switcher（命令请求方），然后实例化了灯泡bulb（命令执行方），最后实例化了一个开关命令switchCommand并注入灯泡（灯泡对应的开关命令），这样三方模块就全部构建完成了。
 * 接下来我们开始使用它们，在第8行将开关switcher的当前命令配置为灯泡的开关命令switchCommand，然后按下按钮触发灯亮，弹起按钮触发灯灭，可以看到第11行的输出结果显示一切正常，与之前的系统行为一模一样。
 * 有些读者可能会产生这样的疑问：我们加入命令模块是为了将命令请求方与命令执行方解耦，而我们的应用场景只是一个简单的电灯开关控制系统，何必如此大动干戈？
 * 此时看来的确没有太大的意义，但在命令模式的架构下我们就可以为系统添加一些高级功能了。
 *
 *
 * 开关类：命令请求者，持有命令接口引用，执行开（调用命令接口的开），关（调用命令接口的关）方法。
 *
 * 灯泡类：命令执行者，最终实现功能：实现灯亮等灭
 *
 * 命令接口：执行命令/反向执行命令
 *
 * 命令实现类：实现命令接口，注入灯泡对象，通过重写命令接口得方法，来操作灯泡对象中的方法
 *
 * 创建一个开关/灯泡/命令实现类（开关），把灯泡注入到命令实现类中，把命令实现类注入到开关中，通过开关来控制灯泡的亮灭
 * （通过接口的方式，解除了开关和灯泡之间的耦合，再加功能，只需要加命令实现类即可）开关只操作命令，而不同的命令实现，则可以对灯泡进行不同的操作。
 *
 */
public class Client {

    public static void main(String[] args) throws InterruptedException {
        /**灯泡案例*/
        // 创建一个开关/灯泡/命令实现类（开关），把灯泡注入到命令实现类中，把命令实现类注入到开关中，通过开关来控制灯泡的亮灭
        Switcher switcher = new Switcher();//命令请求方
        Bulb bulb = new Bulb();//命令执行方
        Command switchCommand = new SwitchCommand(bulb);//开关命令

        switcher.setCommand(switchCommand);//为开关绑定开关命令
        switcher.buttonPush();
        switcher.buttonPop();
      /*输出：
         按下按钮……
             灯亮。
         弹起按钮……
             灯灭。
       */



        /**与之前类似，客户端类Client实例化了闪烁命令flashCommand并植入开关控制器芯片，接着按下按钮，等待3秒后再结束任务。
         * 结果如愿以偿，可以看到第12行的输出中展示的霓虹闪烁效果了。客户端对霓虹灯闪烁效果非常满意，达到了预期的效果。
         * 可以看到，在命令模式构架的电灯开关控制系统中，我们只是新添加了一个闪烁命令，并没有更改任何模块便使灯泡做出了不同的行为响应。
         * 也就是说，命令模式能使我们在不改变任何现有系统代码的情况下，实现命令功能的无限扩展。*/


        /**霓虹灯*/
        Switcher switcher1 = new Switcher();//命令请求方
        Bulb bulb1 = new Bulb();//命令执行方
        Command flashCommand = new FlashCommand(bulb); //闪烁命令

        switcher.setCommand(flashCommand);
        switcher.buttonPush();
        Thread.sleep(3000);//此处观看一会闪烁效果再结束任务
        switcher.buttonPop();
      /*输出：
          按下按钮……
          霓虹灯闪烁任务启动
             灯亮。
             灯灭。
             灯亮。
             灯灭。
             灯亮。
             灯灭。
          弹起按钮……
          霓虹灯闪烁任务结束
       */


    }
}